﻿using System;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web.Mvc;
using System.Web.Helpers;
using System.IO;
using CP_SchoolForChildren_v0._1.Models.DataModel;
using CP_SchoolForChildren_v0._1.Models.RelatedModel;

namespace CP_SchoolForChildren_v0._1.Controllers.FE
{
    public class UserController : Controller
    {
        //
        // GET: /User/
        SFCEntities db = new SFCEntities();
        CheckUserProfile check = new CheckUserProfile();

        public String CurrentUser()
        {
            string currentUserName = User.Identity.Name;
            return currentUserName;
        }

        public int currentUserID()
        {
            string name = CurrentUser();
            var user = from u in db.Users
                       where (u.UserName == name)
                       select u;
            int userid = user.First().UserID;
            return userid;
        }


        public ActionResult ViewUserProfile(int id)
        {
            var listSchool = (from fl in db.FavoriteLists
                              where fl.UserID == id
                              select fl);
            ViewBag.ListSchool = listSchool;   
            return View(db.Users.Find(id));
        }


        public ActionResult Edit(int id)
        {
            // int CurrentUserID = currentUserID();
            if (User.Identity.Name == "")
            {
                return RedirectToAction("Index", "Home");
            }
            var user = from u in db.Users
                       where u.UserID == id
                       select u;
            int userID = user.First().UserID;

            var currentuser = from u in db.Users
                              where u.UserName == User.Identity.Name
                              select u;
            int currentUserRole = currentuser.First().RoleID;
            int currentUserID = currentuser.First().UserID;
            var role = db.UserRoles.Single(ur => ur.RoleName == "Admin");

            if (currentUserID == userID || currentUserRole == role.RoleID)
            {
                var userprofile = from u in db.Users
                                  where u.UserID == id
                                  select new EditProfileModel()
                                  {
                                      UserID = u.UserID,
                                      UserName = u.UserName,
                                      FullName = u.FullName,
                                      UserURL = u.UserURL,
                                      AvatarURL = u.AvatarURL,
                                      DOB = u.DOB,

                                      ChattingID = u.ChattingID,
                                      Phone = u.Phone,
                                  };
             

                return View(userprofile.First());
            }

            return RedirectToAction("index", "Home");
        }

        [Authorize]
        [HttpPost]
        public ActionResult Edit(int id, EditProfileModel model, string Gender)
        {
            User user = db.Users.Single(u => u.UserName == User.Identity.Name);
            int userID = user.UserID;

            var currentuser = from u in db.Users
                              where u.UserName == User.Identity.Name
                              select u;
            try
            {
                int currentUserRole = currentuser.First().RoleID;
                int currentUserID = currentuser.First().UserID;
                var role = db.UserRoles.Single(ur => ur.RoleName == "Admin");

                //change avatar
                if (currentUserID == userID || currentUserRole == role.RoleID)
                {
                    var image = WebImage.GetImageFromRequest();

                    if (image != null)
                    {
                        try
                        {
                            string Extension = Path.GetExtension(image.FileName).ToLower();
                            if (Extension != ".jpg" && Extension != ".png" && Extension != ".jpeg")
                            {
                                ViewBag.Message = "Ảnh chỉ có thể là .JPG hoặc .PNG";
                                return View();
                            }
                            if (image.Width > 50)
                            {
                                image.Resize(50, ((50*image.Height)/image.Width));
                            }
                            image.Save(Path.Combine("~/AvartarUser/" + userID.ToString() + Extension));
                            var filename = Path.Combine("~/AvartarUser/" + userID.ToString() + Extension);


                            model.AvatarURL = Url.Content(filename);
                            user.AvatarURL = model.AvatarURL;
                            db.Entry(user).State = System.Data.EntityState.Modified;
                            db.SaveChanges();
                            return RedirectToAction("Edit", "User", userID);
                        }
                        catch(Exception)
                        {
                            ViewBag.Message = "Đã có lỗi khi kết nối với server, xin kiểm tra đường truyền và thử lại";
                            return View(model);
                        }
                    }

                    //change email
                    if (model.Email != null)
                    {

                        try
                        {
                            if (ModelState.IsValid)
                            {
                                if (user.Password != GenerateMD5HashCode(model.Password))
                                {
                                    ViewBag.Message = "Mật khẩu không đúng";
                                    return View(model);
                                }
                                else if (check.isEmailExist(model.Email))
                                {
                                    ViewBag.Message = "Email đã được dùng để đăng ký, vui lòng chọn email khác";
                                    return View(model);
                                }

                                else
                                {
                                    user.Email = model.Email;
                                    db.Entry(user).State = System.Data.EntityState.Modified;
                                    db.SaveChanges();
                                    ViewBag.Message = "Email của bạn đã được thay đổi.";
                                    return RedirectToAction("Edit", "User", id);
                                }
                            }
                            return View(model);
                        }
                        catch (Exception)
                        {
                            ViewBag.Message = "Đã có lỗi xảy ra khi đổi email, xin hãy kiểm tra kết nối và thử lại";
                            return View(model);
                        }

                    }

                    //change passwod
                    if (model.OldPassword != null)
                    {
                        if (ModelState.IsValid)
                        {
                            try
                            {
                                if (user.Password != GenerateMD5HashCode(model.OldPassword))
                                {
                                    ViewBag.Message = "Mật khẩu không đúng";
                                    return View(model);
                                }
                                else
                                {
                                    user.Password = GenerateMD5HashCode(model.NewPassword);
                                    db.Entry(user).State = System.Data.EntityState.Modified;
                                    db.SaveChanges();
                                    ViewBag.Message = "Mật khẩu của bạn đã được thay đổi.";
                                    return View(model);
                                }
                            }
                            catch (Exception)
                            {
                                ViewBag.Message = "Đã có lỗi xảy ra khi đổi mật khẩu, xin hãy kiểm tra kết nối và thử lại";
                                return View(model);
                            }
                        }
                        return View(model);
                    }

                    // edit general info 
                    if (ModelState.IsValid)
                    {
                        try
                        {
                            User EditUser = db.Users.Single(p => p.UserID == id);
                            EditUser.DOB = model.DOB;
                            EditUser.Gender = Gender;
                            EditUser.UserURL = model.UserURL;
                            EditUser.Phone = model.Phone;
                            EditUser.FullName = model.FullName;
                            EditUser.ChattingID = model.ChattingID;
                            db.Entry(EditUser).State = System.Data.EntityState.Modified;
                            db.SaveChanges();
                            return RedirectToAction("Edit", "User", new {id = EditUser.UserID});
                        }
                        catch (Exception)
                        {
                            ViewBag.Message =
                                "Đã có lỗi trong quá trình đổi thông tin, xin kiểm tra lại kết nối và thử lại";
                            return View(model);
                        }
                    }
                    return View(model);
                }

                else
                {
                    return RedirectToAction("Index", "Home");
                }
            }

            catch (Exception)
            {
                return RedirectToAction("Edit", "User", id);
            }

        }

        public ActionResult DeleteFromList(int id)
        {
            try
            {
                int currentid = currentUserID();
                var user = (from fl in db.FavoriteLists
                             where fl.SchoolID == id
                             select fl).First();
                if (currentid == user.UserID)
                {
                    var favorite = (from fl in db.FavoriteLists
                                   where fl.SchoolID == id
                                   where fl.UserID == user.UserID
                                   select fl).Single();
                    db.FavoriteLists.Remove(db.FavoriteLists.SingleOrDefault(q => q.FavoriteListID == favorite.FavoriteListID ));
                    db.SaveChanges();

                    return RedirectToAction("Edit", "User", new {id = user.UserID});
                }

                return View();
            }
            catch(Exception)
            {
                return RedirectToAction("index", "home");
            }
           
        }
        public static string GenerateMD5HashCode(string strInput)
        {
            MD5 md5 = MD5.Create();
            byte[] inputBytes = Encoding.ASCII.GetBytes(strInput);
            byte[] hash = md5.ComputeHash(inputBytes);

            var sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("x2"));
            }
            return sb.ToString();
        }

    }
}
